package com.mq.mqserver.datacore;

import com.mq.common.MqException;
import com.mq.mqserver.core.Binding;
import com.mq.mqserver.core.Exchange;
import com.mq.mqserver.core.MSGQueue;
import com.mq.mqserver.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 这个类用来管理所有硬盘上的数据
 * 数据库:交换机 队列 绑定关系
 * 文件: 消息
 * 之后上层代码再去调用这些数据的时候,直接通过这个类进行调用,不再调用下层的方法了
 */
public class DiskDataCenter {
    //数据库中的数据
    private DataBaseManage dataBaseManage = new DataBaseManage();
    //数据文件中的数据
    private MessageFileManager messageFileManager = new MessageFileManager();
    //先对两个类进行初始化
    public void init(){
        dataBaseManage.init();
        messageFileManager.init();
    }

    //交换机:
    //添加交换机
    public void insertExchange(Exchange exchange){
        dataBaseManage.insertExchange(exchange);
    }
    //删除交换机
    public void deleteExchange(String exchangeName){
        dataBaseManage.deleteExchange(exchangeName);
    }
    //查找交换机
    public List<Exchange> selectAllExchanges(){
        return dataBaseManage.selectAllExchanges();
    }
    //队列
    //添加队列
    public void insertQueue(MSGQueue queue) throws IOException {
        dataBaseManage.insertQueue(queue);
        //创建队列后,不仅要将队列写入到数据库中,还要创建出对应的目录和文件
        messageFileManager.createQueueFile(queue.getName());
    }

    //删除队列
    public void deleteQueue(String queueName) throws IOException {
        dataBaseManage.deleteQueue(queueName);
        //删除队列后,还要讲对应的目录和文件删除
        messageFileManager.destoryQueueFile(queueName);
    }
    //查找队列
    public List<MSGQueue> selectAllQueues(){
        return dataBaseManage.selectAllQueues();
    }
    //绑定关系
    //添加绑定关系
    public void insertBinding(Binding binding){
        dataBaseManage.insertBinding(binding);
    }
    //删除绑定关系
    public void deleteBinding(String bingingKey){
        dataBaseManage.deleteBindings(bingingKey);
    }
    //查找绑定
    public List<Binding> selectAllBindings(){
        return dataBaseManage.selectAllBindings();
    }
    //消息
    //发送消息
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {
        messageFileManager.sendMessage(queue,message);
    }

    //删除消息
    public void deleteMessageFromQueue(MSGQueue queue,Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManager.deleteMessageFromFile(queue,message);
        //删除消息后,查看是否需要进行GC
        if(messageFileManager.checkGC(queue.getName())){
            messageFileManager.GC(queue);
        }
    }

    //加载所有的消息到内存中
    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManager.loadAllMessageFromQueue(queueName);
    }

}
